home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / utils / disksafe / extras / resetlist.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  6KB  |  153 lines

  1. /*****************************************************************
  2.  ** ResetHandlers                                               **
  3.  **                                                             **
  4.  ** Show the installed reset handlers                           **
  5.  ** Version 1.01, 25 Apr. 1998   © Thomas Richter               **
  6.  **     THOR-Software                                           **
  7.  ** !!! hack !!!                                                **
  8.  *****************************************************************/
  9.  
  10. #include <exec/types.h>
  11. #include <exec/execbase.h>
  12. #include <exec/memory.h>
  13. #include <exec/interrupts.h>
  14. #include <exec/ports.h>
  15. #include <exec/io.h>
  16. #include <devices/keyboard.h>
  17. #include <dos/dos.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21.  
  22. #include <string.h>
  23.  
  24. static char version[]="$VER: ResetList 1.01 (25.4.98)";
  25.  
  26. struct ResetSaveback {
  27.         struct ResetSaveback   *next,*pred;
  28.         BYTE                    pri;
  29.         UBYTE                   reserved;
  30.         char                   *name;
  31.         void                   *data;
  32.         void                   *code;
  33. };
  34.  
  35. int main(void);
  36. int PrintResetHandlers(void);
  37. int ListResetHandlers(struct Interrupt *irq);
  38. int DummyHandler(void);
  39.  
  40. struct DosLibrary *DOSBase;
  41.  
  42. int main(void)
  43. {
  44. int rc=20;
  45.  
  46.         if (DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",37L)) {
  47.                 rc=PrintResetHandlers();
  48.  
  49.                 CloseLibrary((struct Library *)DOSBase);
  50.         }
  51.  
  52.         return rc;
  53. }
  54.  
  55.  
  56. int ListResetHandlers(struct Interrupt *base)
  57. {
  58. struct Interrupt *irq;
  59. struct ResetSaveback *rsb;
  60. char *name;
  61. ULONG len;
  62. int rc=0;
  63. struct List reslist;
  64.  
  65.  
  66.         NewList(&reslist);
  67.         Forbid();
  68.         irq=base;
  69.         while(irq->is_Node.ln_Pred)
  70.                 irq=(struct Interrupt *)(irq->is_Node.ln_Pred);
  71.  
  72.         for(irq=(struct Interrupt *)(irq->is_Node.ln_Succ);irq->is_Node.ln_Succ;irq=(struct Interrupt *)(irq->is_Node.ln_Succ)) {
  73.                 if (irq!=base) {
  74.  
  75.                         if (!(name=irq->is_Node.ln_Name))
  76.                                 name="<NULL>";
  77.  
  78.                         len=strlen(name)+1+sizeof(struct ResetSaveback);
  79.                         if (rsb=AllocVec(len,MEMF_PUBLIC)) {
  80.                                 rsb->pri=irq->is_Node.ln_Pri;
  81.                                 rsb->code=(void *)irq->is_Code;
  82.                                 rsb->data=irq->is_Data;
  83.                                 rsb->name=(char *)(rsb+1);
  84.                                 strcpy(rsb->name,name);
  85.                                 AddTail(&reslist,(struct Node *)rsb);
  86.                         } else  rc=5;
  87.                 }
  88.         }
  89.  
  90.         Permit();
  91.         if (rc) {
  92.                 Printf("ResetList: Out of memory.\n");
  93.         } else {
  94.                 Printf("List of installed reset handlers:\n\n");
  95.                 while(rsb=(struct ResetSaveback *)RemHead(&reslist)) {
  96.                         Printf("Pri : %3ld  Code : 0x%08lx  Data : 0x%08lx  Name : %s\n",rsb->pri,rsb->code,rsb->data,rsb->name);
  97.                         FreeVec(rsb);
  98.                 }
  99.         }
  100.  
  101.         while(rsb=(struct ResetSaveback *)RemHead(&reslist)) {
  102.                 FreeVec(rsb);
  103.         }
  104.  
  105.         return rc;
  106. }
  107.  
  108.  
  109. int DummyHandler(void)
  110. {
  111.         return 0;
  112. }
  113.  
  114. int PrintResetHandlers(void)
  115. {
  116. struct IOStdReq *iostd;
  117. struct MsgPort *port;
  118. struct Interrupt *irq;
  119. int rc=10;
  120.  
  121.         if (irq=AllocMem(sizeof(struct Interrupt),MEMF_PUBLIC|MEMF_CLEAR)) {
  122.                 if (port=CreateMsgPort()) {
  123.                         if (iostd=(struct IOStdReq *)CreateIORequest(port,sizeof(struct IOStdReq))) {
  124.                                 if (!OpenDevice("keyboard.device",0,(struct IORequest *)iostd,0)) {
  125.                                         irq->is_Node.ln_Type=NT_INTERRUPT;
  126.                                         irq->is_Node.ln_Pri=-32;
  127.                                         irq->is_Node.ln_Name="ResetList.Interrupt";
  128.                                         irq->is_Code=(void (*)())&DummyHandler;
  129.                                         iostd->io_Command=KBD_ADDRESETHANDLER;
  130.                                         iostd->io_Data=(void *)irq;
  131.                                         iostd->io_Length=sizeof(struct Interrupt);
  132.                                         if (!DoIO((struct IORequest *)iostd)) {
  133.                                                 ListResetHandlers(irq);
  134.  
  135.                                                 iostd->io_Command=KBD_REMRESETHANDLER;
  136.                                                 if (DoIO((struct IORequest *)iostd)) {
  137.                                                         Printf("ResetList: ALERT! Can't remove dummy reset handler.\n");
  138.                                                         return 20;
  139.                                                 } else rc=0;
  140.                                         } else Printf("ResetList: Can't install dummy reset handler.\n");
  141.                                         CloseDevice((struct IORequest *)iostd);
  142.                                 } else Printf("ResetList: Can't open keyboard.device.\n");
  143.                                 DeleteIORequest((struct IORequest *)iostd);
  144.                         } else Printf("ResetList: Can't build IORequest.\n");
  145.                         DeleteMsgPort(port);
  146.                 } else Printf("ResetList: Can't build MsgPort.\n");
  147.                 FreeMem(irq,sizeof(struct Interrupt));
  148.         } else Printf("ResetList: Can't build Interrupt.\n");
  149.  
  150.         return rc;
  151. }
  152.  
  153.